package com.wrx.club_management_backend.controller;

import com.wrx.club_management_backend.common.AjaxResult;
import com.wrx.club_management_backend.dto.StatisticDTO;
import com.wrx.club_management_backend.mapper.ClubActivityMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.*;

@RestController
@RequestMapping("/statistics")
public class StatisticController {

    @Autowired
    ClubActivityMapper activityMapper;

    /**
     * 查询活动参与人数统计
     *
     * @param dto 统计参数，包含开始日期和结束日期
     * @return 活动参与人数统计数据
     */
    @PostMapping("/activity-participants")
    public AjaxResult participants(@RequestBody StatisticDTO dto){
        if (dto.getStartDate() == null || dto.getEndDate() == null) {
            return AjaxResult.error("开始日期和结束日期不能为空");
        }

        try {
            // 直接格式化Date对象，而不是尝试解析字符串
            SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
            String startDateStr = outputFormat.format(dto.getStartDate());
            String endDateStr = outputFormat.format(dto.getEndDate());

            // 查询指定日期范围内每天的活动参与人数
            List<Map<String, Object>> participantStats = activityMapper.getActivityParticipantsByDateRange(
                    startDateStr,
                    endDateStr
            );

            // 处理结果为前端需要的格式
            List<Map<String, Object>> resultList = new ArrayList<>();

            // 创建一个完整的日期范围
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(dto.getStartDate());

            Calendar endCalendar = Calendar.getInstance();
            endCalendar.setTime(dto.getEndDate());

            // 用于快速查找日期对应的统计数据
            Map<String, Object> statsMap = new HashMap<>();
            for (Map<String, Object> stat : participantStats) {
                // 正确处理日期对象
                Object dateObj = stat.get("date");
                String dateKey;

                if (dateObj instanceof java.sql.Date) {
                    // 如果是SQL Date类型，转换为java.util.Date再格式化
                    dateKey = outputFormat.format(new Date(((java.sql.Date) dateObj).getTime()));
                } else if (dateObj instanceof Date) {
                    // 如果已经是java.util.Date类型
                    dateKey = outputFormat.format((Date) dateObj);
                } else if (dateObj instanceof String) {
                    // 如果已经是字符串
                    dateKey = (String) dateObj;
                } else {
                    // 其他情况，使用toString()
                    dateKey = dateObj.toString();
                }

                statsMap.put(dateKey, stat);
            }

            // 遍历每一天
            while (!calendar.after(endCalendar)) {
                String currentDate = outputFormat.format(calendar.getTime());

                // 查找当前日期的统计数据，如果没有则创建一个计数为0的记录
                Map<String, Object> dayStat = (Map<String, Object>) statsMap.get(currentDate);
                if (dayStat == null) {
                    dayStat = new HashMap<>();
                    dayStat.put("date", currentDate);
                    dayStat.put("count", 0);
                } else {
                    // 确保date字段是字符串格式
                    dayStat.put("date", currentDate);
                }

                resultList.add(dayStat);

                // 日期加1天
                calendar.add(Calendar.DAY_OF_MONTH, 1);
            }

            return AjaxResult.success(resultList);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("查询活动参与人数统计失败：" + e.getMessage());
        }
    }
}
